import axios from 'axios'
import router from '@/router'
import ElementUI from 'element-ui' // 这里使用的是 elementUI

// 配置请求默认接口，环境切换
if (process.env.NODE_ENV === 'development') {
  // 开发环境接口
  axios.defaults.baseURL = 'https://www.liufengtec.com'
} else if (process.env.NODE_ENV === 'production') {
  // 生产环境接口
  axios.defaults.baseURL = 'https://www.liufengtec.com'
}
// 设置请求超时时间
axios.defaults.timeout = 15000
// 是否允许跨域携带cookie信息
axios.defaults.withCredentials = false
// 配置请求头
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'

// http request 拦截器 添加一个请求拦截器
axios.interceptors.request.use((config) => {
  // 每次发送请求之前判断 localStorage 中是否存在token
  // 如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
  // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
  let token = window.localStorage.getItem('token')
  // 添加token
  token && (config.headers.token = token)
  return config
}, (error) => {
  // 请求出错
  return Promise.reject(error)
})
// http response 拦截器 添加一个响应拦截器
axios.interceptors.response.use((response) => {
  if (response.status === 200) {
    return Promise.resolve(response)
  } else {
    return Promise.reject(response)
  }
}, (error) => {
  if (error.response.status) {
    switch (error.response.status) {
      // 401: 未登录
      // 未登录则跳转登录页面，并携带当前页面的路径
      // 在登录成功后返回当前页面，这一步需要在登录页操作
      case 401:
        router.replace({
          path: '/delfualt',
          query: {
            redirect: router.currentRoute.fullPath
          }
        })
        break

      // 403 token过期
      // 登录过期对用户进行提示
      // 清除本地token和清空vuex中token对象
      // 跳转登录页面
      case 403:
        ElementUI.Message({
          message: 'token已过期，请重新登录验证！',
          type: 'warning'
        })
        // 清除token
        window.sessionStorage.clear()
        // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
        router.replace({
          path: '/delfualt',
          query: {
            redirect: router.currentRoute.fullPath
          }
        })
        break;

      // 404请求不存在
      case 404:
        ElementUI.Message({
          message: '网络请求不存在！',
          type: 'warning'
        })
        break;
      // 其他错误，直接抛出错误提示
      default:
        ElementUI.Message({
          message: error.response.data.message,
          type: 'warning'
        })
    }
    return Promise.reject(error.response)
  } else {
    return Promise.reject(error)
  }
})

export default axios
